package com.haiyangwang1.calculator;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class C1 extends JFrame {
        private JTextField txtInput;//定义一个变量名为txtInput的文本框
        private JPanel mainPanel;//定义一个变量名为mainPanel的容器

        private String op;//

        private double num1,num2;//定义两个变量保存按钮输入的数字
        private String result;//保存结果

        private boolean flag;//一个标志

        public C1(){
            this.setTitle("计算器");
            this.setBounds(400,100,250,400);//给窗口位置与大小
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使窗口在点击关闭按钮之后关闭就结束运行了


            txtInput = new JTextField();//new一个文本框对象
            //设置是否可用
            txtInput.setEnabled(false);//使不能从文本框输入东西
            //设置对齐方式
            txtInput.setHorizontalAlignment(JTextField.RIGHT);//使输入的东西靠右显示

            mainPanel = new JPanel();//new一个容器对象
            //设置panel容器为网格布局
            mainPanel.setLayout(new GridLayout(4,4,5,5));

            mainPanel.add(getButton("7"));//获取添加进去的按钮上面的文字
            mainPanel.add(getButton("8"));
            mainPanel.add(getButton("9"));
            mainPanel.add(getButton("*"));
            mainPanel.add(getButton("4"));
            mainPanel.add(getButton("5"));
            mainPanel.add(getButton("6"));
            mainPanel.add(getButton("/"));
            mainPanel.add(getButton("1"));
            mainPanel.add(getButton("2"));
            mainPanel.add(getButton("3"));
            mainPanel.add(getButton("+"));
            mainPanel.add(getButton("0"));
            mainPanel.add(getButton("."));
            mainPanel.add(getButton("="));
            mainPanel.add(getButton("-"));

            this.add(txtInput, BorderLayout.NORTH);//把文本框放在窗口的北面
            this.add(mainPanel);//把容器放在窗口里面
        }

        /**
         * 统一生成按钮的方法
         * @param key 按钮上的文字
         * @return JButton按钮
         */
        private JButton getButton(String key){

            JButton btn = new JButton(key);//new一个带key参数的按钮   key是按钮上的文字是字符串类型
            btn.addActionListener(new ActionListener() {//设置按钮的监听

                public void actionPerformed(ActionEvent e) {//重写ActionEvent 里面的方法  来实现当我们点击按钮时的操作

                    if(flag){//当输入的数字为0的时候，做以下操作
                        txtInput.setText("");
                        num1 = 0;
                        num2 = 0;
                        result = "0";
                        op = "";
                        flag = false;
                    }

                    //返回时间本身getSource()
                    //JButton button = (JButton)e.getSource();
                    //获取按钮上的文字
                    String str = e.getActionCommand();

                    switch(str){
                        case "0":
                        case "1":
                        case "2":
                        case "3":
                        case "4":
                        case "5":
                        case "6":
                        case "7":
                        case "8":
                        case "9":
                            if(txtInput.getText().equals("") && str.equals("0")){//当数字为0-9时，如果文本框里的值为空，或者点击按钮0时
                                txtInput.setText("0");//在输入框里显示0

                            }
                            else if(txtInput.getText().equals("0")){//当拿到的输入的值为0时，就返回，不能继续往后输入
                                return;
                            }
                            else{
                                txtInput.setText(txtInput.getText() + str);//当不为0时，输入框里显示拿到的值
                            }

                            break;

                        case ".":
                            //如果输入框中已经有了.
                            //indexOf String字符串的方法，判断字符串中是否包含有某个字符
                            //如果有返回这个字符在该字符串中的下标位置
                            //如果没有，返回-1
                            if(txtInput.getText().indexOf(".") != -1){// 或者contain也可以   看我们输入的东西有没有包含点
                                return;
                            }
                            if(txtInput.getText().equals("")){//点的下面情况  如果点前面是空的话  那就加个0变成0.然后再输入就是0.几
                                txtInput.setText("0.");
                                return;
                            }
                            txtInput.setText(txtInput.getText() + str);//拿到后面输入的值
                            break;
                        case "+"://当是加号的情况
                            //包装类Double，把字符串转换为double类型
                            num1 = Double.parseDouble(txtInput.getText());//输入的东西是JTextField类型，和定义的数据类型不能相等  所以要用类型转换
                            op = "+";
                            txtInput.setText("");
                            break;
                        case "-":
                            num1 = Double.parseDouble(txtInput.getText());
                            op = "-";
                            txtInput.setText("");
                            break;
                        case "*":
                            num1 = Double.parseDouble(txtInput.getText());
                            op = "*";
                            txtInput.setText("");
                            break;
                        case "/":
                            num1 = Double.parseDouble(txtInput.getText());
                            op = "/";
                            txtInput.setText("");
                            break;
                        case "=":
                            num2 = Double.parseDouble(txtInput.getText());
                            switch(op){
                                case "+":
                                    result = num1 + num2 + "";
                                    break;
                                case "-":
                                    result = num1 - num2 + "";
                                    break;
                                case "/":
                                    if(num2 == 0){
                                        result = "错误";
                                    }
                                    else{
                                        result = num1 / num2 + "";
                                    }

                                    break;
                                case "*":
                                    result = String.valueOf(num1 * num2) ;//拿到两个double类型的值用这个语句和在后面加上一个“”都是一个意思
                                    break;
                            }

                            txtInput.setText(result);
                            flag = true;
                            break;
                    }


                }
            });
            return btn;
        }

        public static void main(String[] args) {
//            Calculator calculator = new Calculator();
            C1 c1 = new C1();
            c1.setVisible(true);
//            calculator.setVisible(true);
        }
    }

